const Base64 = require('./Base64.js');
require('./hmac.js');
require('./sha1.js');
const Crypto = require('./crypto.js');


const uploadFile = function (filePath, name) {
    return new Promise((resolve, reject) => {
        if (!filePath || filePath.length < 9) {
            reject(new Error('视频错误，请重试'));
            return;
        }

        console.log('上传视频…');
        const aliyunFileKey = name + '' + (new Date().getTime()) + '.jpg';
        const aliyunServerURL = 'https://feedslot.oss-cn-beijing.aliyuncs.com';
        const accessid = 'LTAI5tMWeRN1CaykgSmrDuoK';
        const policyBase64 = getPolicyBase64();
        const signature = getSignature(policyBase64);

        console.log('aliyunFileKey=', aliyunFileKey);

        wx.uploadFile({
            url: aliyunServerURL,
            filePath: filePath,
            name: 'file',
            formData: {
                'key': aliyunFileKey,
                'OSSAccessKeyId': accessid,
                'policy': policyBase64,
                'Signature': signature,
                'success_action_status': '200',
            },
            success: function (res) {
                if (res.statusCode != 200) {
                    reject(new Error('上传错误:' + JSON.stringify(res)));
                    return;
                }
                resolve(aliyunFileKey);
            },
            fail: function (err) {
                err.wxaddinfo = aliyunServerURL;
                reject(err);
            },
        });
    });
};

const getPolicyBase64 = function () {
    let date = new Date();
    date.setHours(date.getHours() + 60000);
    let srcT = date.toISOString();
    const policyText = {
        "expiration": srcT, //设置该Policy的失效时间，超过这个失效时间之后，就没有办法通过这个policy上传文件了 指定了Post请求必须发生在2020年01月01日12点之前("2020-01-01T12:00:00.000Z")。
        "conditions": [
            ["content-length-range", 0, 20 * 1024 * 1024] // 设置上传文件的大小限制,1048576000=1000mb
        ]
    };

    const policyBase64 = Base64.encode(JSON.stringify(policyText));
    return policyBase64;
}

const getSignature = function (policyBase64) {
    const accesskey = 'qs5OylMEIqInMBiUud8DnWvLQ87gWN';

    const bytes = Crypto.HMAC(Crypto.SHA1, policyBase64, accesskey, {
        asBytes: true
    });
    const signature = Crypto.util.bytesToBase64(bytes);

    return signature;
}

module.exports = uploadFile;